package com.lpf.config;

import com.lpf.beans.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 ***********************************************************************************************************************
 * bean的生命周期：bean创建---初始化---销毁的过程。
 *
 * 容器管理bean的生命周期。
 * 我们可以自定义初始化和销毁方法，容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。
 * 
 * 构造（对象创建）：
 * 		单实例：在容器启动的时候创建对象；
 * 		多实例：在每次获取的时候创建对象。
 *
 * 创建之后初始化之前调用：BeanPostProcessor.postProcessBeforeInitialization
 * 初始化：对象创建完成，并赋值好，调用初始化方法。。。
 *
 * 销毁之前调用：BeanPostProcessor.postProcessAfterInitialization
 * 销毁：
 * 		单实例：容器关闭的时候；
 * 		多实例：容器不会管理这个bean；容器不会调用销毁方法。
 ***********************************************************************************************************************
 * 
 * 遍历得到容器中所有的BeanPostProcessor，挨个执行postProcessorsBeforeInitialization，
 * 一但返回null，跳出for循环，不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization
 * 
 * 	BeanPostProcessor原理（执行过程）：
 * 		populateBean(beanName, mbd, instanceWrapper); 给bean进行属性赋值
 * 		initializeBean
 * 		{
 * 				applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 * 				invokeInitMethods(beanName, wrappedBean, mbd); 执行自定义初始化
 * 				applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 * 		}
 *
 ***********************************************************************************************************************
 * 指定bean生命周期的几种方式：
 * 		1）、指定初始化和销毁方法：通过@Bean指定init-method和destroy-method；
 * 		2）、通过让Bean实现InitializingBean（定义初始化逻辑），DisposableBean（定义销毁逻辑）；
 * 				InitializingBean：当BeanFactory创建好对象并且设置好属性之后，会调用afterPropertiesSet方法进行初始化，也就相当于初始化方法。
 * 				DisposableBean：在BeanFactory销毁的时候对单实例调用destroy方法进行销毁。
 * 		3）、可以使用JSR250;
 * 				@PostConstruct ：在bean创建完成并且属性赋值完成之后来执行初始化方法；
 * 				@PreDestroy ：在容器销毁bean之前通知我们进行清理工作。
 * 		4）、BeanPostProcessor【interface】：bean的后置处理器；在bean初始化前后进行一些处理工作；
 * 				postProcessBeforeInitialization：在bean实例创建之后，任何初始化方法调用之前工作；
 * 				postProcessAfterInitialization：在初始化方法执行完成之后工作.
 ***********************************************************************************************************************
 *
 * Spring底层对BeanPostProcessor的使用：
 * 		bean创建，bean初始化，bean赋值，注入其他组件，@Autowired，生命周期注解功能，@Async,xxx BeanPostProcessor；
 * 例如：
 * 		AsyncAnnotationBeanPostProcessor：处理异步方法的，处理 @Async 注解的；
 * 		ApplicationContextAwareProcessor：帮助我们向组件中注入IOC容器；
 * 		BeanValidationPostProcessor：做数据校验；
 * 		BeanValidationPostProcessor：处理 @PostConstruct 和 @PreDestroy 两个注解；
 * 		AutowiredAnnotationBeanPostProcessor：在对象创建完成后处理 @Autowired 注解。
 *
 ***********************************************************************************************************************
 */
@ComponentScan("com.lpf.beans")
@Configuration
public class MainConfigOfLifeCycle {

	//@Scope("prototype")
	@Bean(initMethod = "init", destroyMethod = "detory")
	public Car car() {
		return new Car();
	}

}
